<?php

namespace App\Providers;

use App\BCAM\CMVariable\CMVariable;
use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    /**
     * 事件监听器映射
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        'App\Events\Event' => [
            'App\Listeners\EventListener',
        ],
        /** 1.注册事件/监听器
         * 1.1首先需要在EventServiceProvider中注册事件与监听器之间的映射关系.
         * 1.2然后我们在项目根目录运行如下Artisan命令php artisan event:generate
         * 该命令会在app/Events目录下生成PostSaved.php，在app/Listeners目录下生成SaveDataToCache.php。
         */
        //这是事件类
        'App\Events\PostSaved' => [
            'App\Listeners\SaveDataToCache'
        ],
        'App\Events\EventLab' =>[
            //监听器有执行顺序的
            'App\Listeners\LabListener',
            //重复的也可以
            //'App\Listeners\LabListener',
            'App\Listeners\SaveDataToCache',
        ],
        'App\Events\EvevtQueueLab' => [
            'App\Listeners\QueueListener'
        ]
    ];

    //注册事件订阅者
    protected $subscribe = [
        'App\Listeners\QueueListener',
    ];



    /**
     * Register any events for your application.
     *
     * @return void
     */
    public function boot()
    {
        //触发顺序
        //自动注册->手动注册(手动注册中又有顺序,条件越苛刻触发时机越前)

        parent::boot();
        //手动注册事件
        //同一事件,手动注册事件后于自动注册事件的监听器触发
        Event::listen('App\Events\EventLab',function($event){
            print '手动注册的';
        });

        //通配符事件监听器
        // $data是一个事件名的字符串,例如App\Events\EventLab
        /*Event::listen('App\Events\*', function ($data) {
            CMVariable::compareRes($data);
            //希望停止事件被传播到其它监听器，你可以通过从监听器的 handle 方法中返回 false 来实现
            return false;
        });*/

        //事实证明,如果是web访问以下两个系统自带的事件会先运行
        //bootstrapped: Illuminate\Foundation\Bootstrap\BootProviders
        //Illuminate\Routing\Events\RouteMatched

        //若是queue:listen指令,每次监听都会先运行:
        //"bootstrapped: Illuminate\Foundation\Bootstrap\BootProviders"
        //"Illuminate\Console\Events\ArtisanStarting"

        /*Event::listen('*', function ($data) {
            //
            CMVariable::compareRes($data);
        });*/

    }
}
